home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / madtrb30.arc / SERIAL.PAS < prev    next >
Pascal/Delphi Source File  |  1985-05-17  |  5KB  |  185 lines

  1. { A set of routines to enable COM1 and COM2 to be accessed from Turbo Pascal.
  2.   The following procedures are meant to be called by your programs:
  3.  
  4.   AssignAux(PortNumber in [1,2]) assigns AUX to COM1 or COM2
  5.   AssignUsr(PortNumber in [1,2]) assigns USR to COM1 or COM2
  6.   SetSerial(PortNumber in [1,2],
  7.             BaudRate in [110,150,300,600,1200,2400,4800,9600],
  8.             StopBits in [1,2],
  9.             DataBits in [7,8],
  10.             Parity in [None,Even,Odd]) sets the baud rate, stop bits, data
  11.                                bits, and parity of one of the serial ports.
  12.  
  13.   The arrays InError and OutError may be examined to detect errors.  The bits
  14.   are as follows:
  15.      Bit 7 (128)        Time out (no device connected)
  16.      Bit 3 (8)          Framing error
  17.      Bit 2 (4)          Parity error
  18.      Bit 1 (2)          Overrun error
  19.  
  20.   Function SerialStatus(PortNumber in [1,2]) returns a more complete status:
  21.      Bit 15 (negative)  Time out (no device connected)
  22.      Bit 14 (16384)     Transmission shift register empty
  23.      Bit 13 (8192)      Transmission holding register empty
  24.      Bit 12 (4096)      Break detect
  25.      Bit 11 (2048)      Framing error
  26.      Bit 10 (1024)      Parity error
  27.      Bit 9  (512)       Overrun error
  28.      Bit 8  (256)       Data ready
  29.      Bit 7  (128)       Received line signal detect
  30.      Bit 6  (64)        Ring indicator
  31.      Bit 5  (32)        Data set ready
  32.      Bit 4  (16)        Clear to send
  33.      Bit 3  (8)         Delta receive line signal detect
  34.      Bit 2  (4)         Trailing edge ring detector
  35.      Bit 1  (2)         Delta data set ready
  36.      Bit 0  (1)         Delta clear to send
  37.  
  38.   Identifiers starting with "__" are not meant to be used by the user program.
  39. }
  40.  
  41.   Type
  42.     __RegisterSet=Record Case Integer Of
  43.                   1: (AX,BX,CX,DX,BP,DI,SE,DS,ES,Flags: Integer);
  44.                   2: (AL,AH,BL,BH,CL,CH,DL,DH: Byte);
  45.                 End;
  46.     __ParityType=(None,Even,Odd);
  47.  
  48.   Var
  49.     __Regs: __RegisterSet;
  50.     InError,OutError: Array [1..2] Of Byte;
  51.  
  52.   Procedure __Int14(PortNumber,Command,Parameter: Integer);
  53.   { Do a BIOS COM driver interrupt }
  54.  
  55.     Begin
  56.       With __Regs Do
  57.        Begin
  58.         DX:=PortNumber-1;
  59.         AH:=Command;
  60.         AL:=Parameter;
  61.         Flags:=0;
  62.         Intr($14,__Regs);
  63.        End;
  64.     End;
  65.  
  66.  
  67.   Procedure SetSerial(PortNumber,BaudRate,StopBits,DataBits: Integer;
  68.                       Parity: __ParityType);
  69.   { Set serial parameters on a COM port }
  70.  
  71.     Var
  72.       Parameter: Integer;
  73.  
  74.     Begin
  75.       Case BaudRate Of
  76.         110: BaudRate:=0;
  77.         150: BaudRate:=1;
  78.         300: BaudRate:=2;
  79.         600: BaudRate:=3;
  80.         1200: BaudRate:=4;
  81.         2400: BaudRate:=5;
  82.         4800: BaudRate:=6;
  83.         Else BaudRate:=7; { Default to 9600 baud }
  84.        End;
  85.       If StopBits=2 Then StopBits:=1
  86.       Else StopBits:=0; { Default to 1 stop bit }
  87.       If DataBits=7 Then DataBits:=2
  88.       Else DataBits:=3; { Default to 8 data bits }
  89.       Parameter:=(BaudRate Shl 5)+(StopBits Shl 2)+DataBits;
  90.       Case Parity Of
  91.         Odd: Parameter:=Parameter+8;
  92.         Even: Parameter:=Parameter+24;
  93.         Else; { Default to no parity }
  94.        End;
  95.       __Int14(PortNumber,0,Parameter);
  96.     End;
  97.  
  98.  
  99.   Function SerialStatus(PortNumber: Integer): Integer;
  100.   { Return the status of a COM port }
  101.  
  102.     Begin
  103.       __Int14(PortNumber,3,0);
  104.       SerialStatus:=__Regs.AX;
  105.     End;
  106.  
  107.  
  108.   Procedure __OutPort1(C: Byte);
  109.   { Called by Write to AUX or USR when assigned to COM1 }
  110.  
  111.     Begin
  112.       While (SerialStatus(1) And $30)=0 Do ;
  113.       __Int14(1,1,C);
  114.       OutError[1]:=OutError[1] Or (__Regs.AH And $8E);
  115.     End;
  116.  
  117.  
  118.   Procedure __OutPort2(C: Byte);
  119.   { Called by Write to AUX or USR when assigned to COM2 }
  120.  
  121.     Begin
  122.       While (SerialStatuS(2) And $30)=0 Do ;
  123.       __Int14(2,1,C);
  124.       OutError[2]:=OutError[2] Or (__Regs.AH And $8E);
  125.     End;
  126.  
  127.  
  128.   Function __InPort1: Char;
  129.   { Called by Read from AUX or USR when assigned to COM1 }
  130.  
  131.     Begin
  132.       __Int14(1,2,0);
  133.       __InPort1:=Chr(__Regs.AL);
  134.       InError[1]:=InError[1] Or (__Regs.AH And $8E);
  135.     End;
  136.  
  137.  
  138.   Function __InPort2: Char;
  139.   { Called by Read from AUX or USR when assigned to COM2 }
  140.  
  141.     Begin
  142.       __Int14(2,2,0);
  143.       __InPort2:=Chr(__Regs.AL);
  144.       InError[2]:=InError[2] Or (__Regs.AH And $8E);
  145.     End;
  146.  
  147.  
  148.   Procedure __AssignPort(PortNumber: Integer; Var InPtr,OutPtr: Integer);
  149.   { Assign either AUX or USR to either COM1 or COM2 }
  150.  
  151.     Begin
  152.       If PortNumber=2 Then
  153.        Begin
  154.         OutPtr:=Ofs(__OutPort2);
  155.         InPtr:=Ofs(__InPort2);
  156.        End
  157.       Else { Default to port 1 }
  158.        Begin
  159.         OutPtr:=Ofs(__OutPort1);
  160.         InPtr:=Ofs(__InPort1);
  161.        End;
  162.       InError[PortNumber]:=0;
  163.       OutError[PortNumber]:=0;
  164.     End;
  165.  
  166.  
  167.   Procedure AssignAux(PortNumber: Integer);
  168.   { Assign AUX to either COM1 or COM2 }
  169.  
  170.     Begin
  171.       __AssignPort(PortNumber,AuxInPtr,AuxOutPtr);
  172.     End;
  173.  
  174.  
  175.   Procedure AssignUsr(PortNumber: Integer);
  176.   { Assign USR to either COM1 or COM2 }
  177.  
  178.     Begin
  179.       __AssignPort(PortNumber,UsrInPtr,UsrOutPtr);
  180.     End;
  181.  
  182.  
  183. { See also SERTST.PAS in this XA for a little demo program using these
  184.   procedures     }
  185.